{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "eb38f84b",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "#  9\\.  回归方法综合应用练习  # \n",
    "\n",
    "##  9.1.  介绍  # \n",
    "\n",
    "本次挑战将会结合前面学习到的相关回归分析方法，完成一个多元回归分析任务。同时，我们将结合 NumPy，scikit-learn，SciPy，statsmodels 等库，复习不同方法的实现及应用。 \n",
    "\n",
    "##  9.2.  知识点  # \n",
    "\n",
    "  * 一元线性回归 \n",
    "\n",
    "  * 多元线性回归 \n",
    "\n",
    "  * 假设检验 \n",
    "\n",
    "挑战使用《An Introduction to Statistical Learning》书中提供的 ` Advertising  ` 示例数据集用于练习。该书是统计学习经典著作，有兴趣的话可以从作者网站 [ 免费下载阅读 ](http://www-bcf.usc.edu/~gareth/ISL/) 。 \n",
    "\n",
    "首先，我们加载并预览该数据集。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "be007ff5",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "outputs": [],
   "source": [
    "# 下载数据集\n",
    "!wget -nc https://cdn.aibydoing.com/aibydoing/files/advertising.csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "66a328c8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tv</th>\n",
       "      <th>radio</th>\n",
       "      <th>newspaper</th>\n",
       "      <th>sales</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>230.1</td>\n",
       "      <td>37.8</td>\n",
       "      <td>69.2</td>\n",
       "      <td>22.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>44.5</td>\n",
       "      <td>39.3</td>\n",
       "      <td>45.1</td>\n",
       "      <td>10.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>17.2</td>\n",
       "      <td>45.9</td>\n",
       "      <td>69.3</td>\n",
       "      <td>9.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>151.5</td>\n",
       "      <td>41.3</td>\n",
       "      <td>58.5</td>\n",
       "      <td>18.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>180.8</td>\n",
       "      <td>10.8</td>\n",
       "      <td>58.4</td>\n",
       "      <td>12.9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      tv  radio  newspaper  sales\n",
       "1  230.1   37.8       69.2   22.1\n",
       "2   44.5   39.3       45.1   10.4\n",
       "3   17.2   45.9       69.3    9.3\n",
       "4  151.5   41.3       58.5   18.5\n",
       "5  180.8   10.8       58.4   12.9"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "data = pd.read_csv(\"../data/advertising.csv\", index_col=0,)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e65993b8",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "|  tv  |  radio  |  newspaper  |  sales   \n",
    "---|---|---|---|---  \n",
    "1  |  230.1  |  37.8  |  69.2  |  22.1   \n",
    "2  |  44.5  |  39.3  |  45.1  |  10.4   \n",
    "3  |  17.2  |  45.9  |  69.3  |  9.3   \n",
    "4  |  151.5  |  41.3  |  58.5  |  18.5   \n",
    "5  |  180.8  |  10.8  |  58.4  |  12.9   \n",
    "  \n",
    "数据集包含 4 列，共 200 行。每个样本代表某超市销售相应单位件商品所需要支出的广告费用。以第一行为例，表示该超市平均销售 22.1 件商品，需要支出的电视广告费用，广播广告费用以及报刊广告费用为：230.1 美元，37.8 美元和 69.2 美元。 \n",
    "\n",
    "所以，本次挑战将前 3 列视作特征，最后一列视作目标值。 \n",
    "\n",
    "Exercise 9.1 \n",
    "\n",
    "挑战：使用 SciPy 提供的普通最小二乘法分别计算 3 个特征与目标之间的一元线性回归模型拟合参数。 \n",
    "\n",
    "规定：需使用 ` scipy.optimize.leastsq  ` 函数完成计算，并直接输出函数结果无需处理。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4fde0908",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy.optimize import leastsq\n",
    "\n",
    "## 代码开始 ### (≈ 10 行代码)\n",
    "params_tv = None\n",
    "params_radio = None\n",
    "params_newspaper = None\n",
    "## 代码结束 ###\n",
    "\n",
    "params_tv[0], params_radio[0], params_newspaper[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e70dd511",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "参考答案  Exercise 9.1 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "239dcd55",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((array([7.03259356, 0.04753664]), 1),\n",
       " array([9.3116381 , 0.20249578]),\n",
       " array([12.35140705,  0.0546931 ]))"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from scipy.optimize import leastsq\n",
    "\n",
    "### 代码开始 ### (≈ 10 行代码)\n",
    "p_init = np.random.randn(2)\n",
    "\n",
    "def func(p, x):\n",
    "    w0, w1 = p\n",
    "    f = w0 + w1*x\n",
    "    return f\n",
    "\n",
    "def err_func(p, x, y):\n",
    "    ret = func(p, x) - y\n",
    "    return ret\n",
    "\n",
    "params_tv = leastsq(err_func, p_init, args=(data.tv, data.sales))\n",
    "params_radio = leastsq(err_func, p_init, args=(data.radio, data.sales))\n",
    "params_newspaper = leastsq(err_func, p_init, args=(data.newspaper, data.sales))\n",
    "### 代码结束 ###\n",
    "\n",
    "params_tv[0], params_radio[0], params_newspaper[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "155c4f98",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "期望输出 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "16c347f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "((array([7.03259354, 0.04753664]),\n",
    " (array([9.31163807, 0.20249578]),\n",
    " (array([12.35140711, 0.0546931]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b06a6ed7",
   "metadata": {},
   "source": [
    "这段代码实现了使用最小二乘法拟合线性模型的功能，具体是对三个不同的数据集（`tv`、`radio` 和 `newspaper`）分别拟合线性关系。以下是代码的详细解释：\n",
    "\n",
    "### 导入模块\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "09c3b4f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy.optimize import leastsq"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "84948bbc",
   "metadata": {},
   "source": [
    "- `numpy` 用于生成随机数和处理数组。\n",
    "- `scipy.optimize.leastsq` 是 SciPy 提供的最小二乘法优化函数，用于拟合模型。\n",
    "\n",
    "---\n",
    "\n",
    "### 初始化参数\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d4352504",
   "metadata": {},
   "outputs": [],
   "source": [
    "p_init = np.random.randn(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81db5fa2",
   "metadata": {},
   "source": [
    "- `p_init` 是初始参数，包含两个随机值，表示线性模型的两个系数（截距 `w0` 和斜率 `w1`）。\n",
    "\n",
    "---\n",
    "\n",
    "### 定义线性模型函数\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "90ddf1c4",
   "metadata": {},
   "outputs": [],
   "source": [
    "def func(p, x):\n",
    "    w0, w1 = p\n",
    "    f = w0 + w1*x\n",
    "    return f"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d132bfa",
   "metadata": {},
   "source": [
    "- `func` 是线性模型函数，表示 `f(x) = w0 + w1 * x`。\n",
    "- 输入参数：\n",
    "  - `p` 是一个包含模型参数的数组 `[w0, w1]`。\n",
    "  - `x` 是自变量。\n",
    "\n",
    "---\n",
    "\n",
    "### 定义误差函数\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5bbfd3de",
   "metadata": {},
   "outputs": [],
   "source": [
    "def err_func(p, x, y):\n",
    "    ret = func(p, x) - y\n",
    "    return ret"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "138d9b38",
   "metadata": {},
   "source": [
    "- `err_func` 是误差函数，用于计算模型预测值与真实值之间的差异。\n",
    "- 输入参数：\n",
    "  - `p` 是模型参数。\n",
    "  - `x` 是自变量。\n",
    "  - `y` 是目标变量（真实值）。\n",
    "- 返回值：\n",
    "  - `ret` 是误差数组，表示每个数据点的预测值与真实值的差。\n",
    "\n",
    "---\n",
    "\n",
    "### 使用最小二乘法拟合模型\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6264f9f2",
   "metadata": {},
   "outputs": [],
   "source": [
    "params_tv = leastsq(err_func, p_init, args=(data.tv, data.sales))\n",
    "params_radio = leastsq(err_func, p_init, args=(data.radio, data.sales))\n",
    "params_newspaper = leastsq(err_func, p_init, args=(data.newspaper, data.sales))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b177b468",
   "metadata": {},
   "source": [
    "- `leastsq` 函数用于最小化误差函数，返回拟合的参数。\n",
    "- 对三个数据集分别进行拟合：\n",
    "  - `data.tv` 和 `data.sales`：拟合电视广告支出与销售额的关系。\n",
    "  - `data.radio` 和 `data.sales`：拟合广播广告支出与销售额的关系。\n",
    "  - `data.newspaper` 和 `data.sales`：拟合报纸广告支出与销售额的关系。\n",
    "\n",
    "---\n",
    "\n",
    "### 输出拟合结果\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d8fd096d",
   "metadata": {},
   "outputs": [],
   "source": [
    "params_tv[0], params_radio[0], params_newspaper[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6cbc49cf",
   "metadata": {},
   "source": [
    "- `params_tv[0]`、`params_radio[0]` 和 `params_newspaper[0]` 分别是三个数据集的拟合参数 `[w0, w1]`。\n",
    "- 这些参数表示每个广告类型的线性模型的截距和斜率。\n",
    "\n",
    "---\n",
    "\n",
    "### 总结\n",
    "\n",
    "leastsq 函数来自于 scipy.optimize 模块，是一个通用的非线性最小二乘优化工具，即通过最小化误差的平方和来寻找一组参数，使得给定的函数尽可能好地拟合一组数据点。可以解决线性和非线性问题。\n",
    "\n",
    "对于线性问题，虽然可以使用 leastsq，但更推荐使用专用的线性回归方法（如 np.linalg.lstsq 或 Scikit-learn 的 LinearRegression），因为它们更高效且更直观。\n",
    "\n",
    "这段代码的核心是使用最小二乘法拟合线性模型，分别找到电视、广播和报纸广告支出与销售额之间的线性关系。最终输出每个模型的参数，用于描述这些关系。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dfa198fe",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "接下来，我们根据最小二乘法求得的结果，将拟合直线绘制到原分布散点图中。 \n",
    "\n",
    "Exercise 9.2 \n",
    "\n",
    "挑战：以横向子图的方式绘制 3 个特征分别与目标之间的散点图，并添加线性拟合直线。 \n",
    "\n",
    "规定：线性拟合直线开始于散点图中最小横坐标值，结束于最大横坐标值，并以红色显示。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "99673755",
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "## 代码开始 ### (≈ 10 行代码)\n",
    "\n",
    "## 代码结束 ###"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43db94fa",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "参考答案  Exercise 9.2 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "7e61f573",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x23318433a50>]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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3BhVqlTBEUccgQcffBDNmzfP+P27du3SPnRFRUWuj6zoJMlYu1pFFO3Yg30JX3Zy5IWIiILN77hmdZZA0IvgB5VTN8lRZeUG0ouZM0RhZiWuuXGv5macCnr7EOTj9yoRyHhLFLEajb1798Zrr72GL774AsOHD8eyZctw9NFH4/fff8/4MxLYCgoKSj+aNWvmet2PRIXFe5BfNTmgcQo2ERGpFNes1LAKehF8ijazGxc4XdeNKCqsxjU3YprbcSro7UPQj5+byhEFT14slmZqnqK2bt2KFi1a4IknnsBll11mepRMAlhhYSHy8/MdO5bxi9bjolemZ/z6m5f1wt6SGKdgExFZIG223Hg43Waryu+4ZjRLQJahHff4uIw/P3ZoP8Y4ChUuoSMnRS2mmYlrTsc0L+NU0NuHoB8/EQUnrim/dDpRrVq10L59eyxZsiTj91SuXFn7cFvi0uh0JMkoIy9ERESqxjWj5UJBLSJPZBeX0BG5G9ecjmlexqmgtw9BP34iCg6ll06n2rZtG3755Rc0atTI70MJdGFdIiJSg0pxLR3GOiIiUjmuMU4REalH6UTj0KFDMW7cOCxfvhyTJk3C4MGDUb58eZx//vnKFNaVQrqJ5HN5nKNFREQUpLiWDmMdERGpHNcYp4iI1KN0ovHXX3/VglSHDh1w7rnnom7dupgyZQrq1asHFQS9sC4REXlL9biWDmMdERGpHNcYp4iI1BKozWBULcLMwrpERM6IYuH8oDxHjHVERNYwpnn7HDFOERG5K5SbwaiKhXWJiCjsGOuIiEhljFNERGpQeuk0ERERERERERERBQMTjURERERERERERJQzJhqJiIiIiIiIiIgoZ0w0EhERERERERERUc6YaCQiIiIiIiIiIqKcMdFIREREREREREREOWOikYiIiIiIiIiIiHLGRCMRERERERERERHlrELuvyJalm7YhhWbi9GybnW0Oqi634dDREREHmD8JyIKJ7bvRETOYqLRpK3Fu3H9iDkYv3hD6WPHtKuHZ87vhoJqFX09NiIiInIH4z8RUTixfScicgeXTpskQWjiko1Jj8nn142Y7dsxERERkbsY/4mIwontOxGRO5hoNDmdXka69sViSY/L5/L4so3bfTs2IiIicgfjPxFROLF9JyJyDxONJkjNjmyWb2IgIiIiChvGfyKicGL7TkTkHiYa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WIUKFWL3339/bPHixbG33norVq1atdh///vf0u8JQx/k4osvjjVp0iT2ySefaO3nyJEjtbbz1ltvDfx5hj334BYmGrN45plntAauUqVKsV69esWmTJkSC6I//vGPsUaNGmnnIQ2AfC7JDp1cBFdffXWsdu3aWsM3ePBgLaipauzYsdpFnvohDZy+zfxdd90Va9CggdYBOf7442MLFy5M+h2bNm3SLu4aNWrE8vPzY5deeqnWiKh+ftLRkASNJGYqVqwYa9GiReyKK64o06lS+fzSnZt8vPrqq5bek8uXL4+dcsopsapVq2qBTG4O9uzZE1P9/FauXKklFevUqaO9P9u2bRu75ZZbYoWFhYE4v7/85S/a+07aE3kfyvWl35gH/bWLirDENq/jRhg41f6GgRNtWVil3vBH6bkIW5857MIWz6LcRoe53fn444+1QXbpX3Ts2DH24osvJn09DH2QoqIi7fWT67FKlSraJIo77rgjtmvXrsCfZ9hzD27Jk/+Yn/9IREREREREREREVBZrNBIREREREREREVHOmGgkIiIiIiIiIiKinDHRSERERERERERERDljopGIiIiIiIiIiIhyxkQjERERERERERER5YyJRiIiIiIiIiIiIsoZE41ERERERERERESUMyYaiYiIiEgJr732GmrVqlX6+T333IPDDjvM12MiIiIiIvOYaCQKgH79+uFvf/ub34dBRETkqaFDh+Kbb77x+zCIiIiIyCQmGomIiIjIUbt373bk99SoUQN169Z15HcRERFF3Z49e/w+BIoAJhqJFHfJJZdg3Lhx+Ne//oW8vDzto2nTphg+fHjS982ePRvlypXDihUrfDtWIiKK7sz7a6+9Vpt9f9BBB+Gkk07CE088gc6dO6N69epo1qwZrr76amzbtq3MUunmzZujWrVqGDx4MDZt2pT09dSl0yUlJfjHP/6hxcHKlStrX/viiy88O08iIlI3Dl1//fW49dZbUadOHTRs2FCLIbqtW7fi8ssvR7169ZCfn4/jjjsOP/zwg/a1wsJClC9fHjNmzCiNNfI7+vTpU/rz//3vf7VYpg+mScxr1KgRqlSpghYtWuDBBx8s/V65X5N7tVNOOQVVq1ZF69at8f777ycd72233Yb27dtr8U++ftdddyUlAfX498ILL2h/V77v3HPP1Y410UsvvYSDDz5YO46OHTviueeeK/3a8uXLtWP53//+h2OPPVb7nrfeesvBZ50oPSYaiRQnCcYjjjgCV1xxBdauXat9nH/++Xj77beTvk+CxlFHHaUFOiIiIq+9/vrrqFSpEiZOnIjnn39eG/x6+umnsWDBAu1r3377rXYDqJs6dSouu+wy7WZtzpw56N+/P/75z38axsTHH38cjz32GObOnaslNM8880wsXrzYgzMkIiKVSayRwS2JL4888og2MDVmzBjta3/4wx+wfv16fP7555g5cya6d++O448/Hps3b0ZBQYGW1Pvuu++07503b56WoJOJHPoAmUz8kGSdkNg2evRovPvuu1i4cKF2H9ayZcukY5HE4dlnn60lMy+88EKcd955+Omnn0q/XrNmTW2w7ccff9Ri23/+8x88+eSTSb9jyZIl2t/4+OOPtUE1OR4ZtNPJ3/373/+O+++/X/vdDzzwgPZ35XlINGzYMNxwww3a90jcJHJdjIiUd+yxx8ZuuOGG0s9nz54dy8vLi61YsUL7fN++fbEmTZrEhg8f7uNREhFRlONUt27dsn7Pe++9F6tbt27p5+eff37s1FNPTfqeP/7xj7GCgoLSz+++++5Y165dSz9v3Lhx7P7770/6mZ49e8auvvpqB86CiIiCHIf69u1bJj7cdtttse+//z6Wn58f27lzZ9LX27RpE3vhhRe0/7/ppptip512mvb/Tz31lBaPJP58/vnn2mNt27aNvfjii9r/X3fddbHjjjsuVlJSkvZYJM0yZMiQpMd69+4du+qqqzIe/6OPPhrr0aNHUvwrX7587Ndffy19TI6lXLlysbVr15Ye/9tvv530e+67777YEUccof3/smXLtGOR8yHyEmc0EgWQjLjJFHl9VqOMsMkInYzUERER+aFHjx5Jn3/99dfabJEmTZpoMzf+/Oc/a0uji4uLta/LzIrevXsn/YzM4M+kqKgIa9as0WbvJ5LPE2eJEBFRNHXp0iXpc1naLPdIMqtQZiZKzV+p/at/LFu2DL/88ov2vTJbccKECdi3b592byVLseVDZjlK7JHZhfK5XtpKZuJ36NBBW6791VdflTmW1HgmnyfGKlnOLPFLlnjLsdx5551YuXJl0s9IaRGJoYm/Q5Z1yyzK7du3a8cuKwMSz0lWBujnpDv88MNzel6JrGKikSigZAq+nmiUf08++WQWzCciIt/IcrXEulCnn366dtP3wQcfaMvUnn32WUc3iiEiIkpUsWLFpM9l+bMk5iTJKElHSQ4mfkjC7pZbbtG+95hjjsHvv/+OWbNmYfz48UmJRkk8Nm7cGO3atdO+V5ZdS5Lyvvvuw44dO7Taieecc47p45w8ebJ2L3fqqafik08+0ZZE33HHHZbio76kW5ZcJ57T/PnzMWXKlIzxmcgLFTz5K0SUE6l5JaNriS644AJt5Etu3qS4sNTDIiIiUoHEJrm5k3qKUqtRSJ2pRDIzX+poJUq9OUokxfvlRk9qQOp1soR83qtXL8fPgYiIwkESg+vWrUOFChXK1FLU1apVSxsc+/e//60lLGVjlfr16+OPf/yjlgxMjDt6TJKvyYckGWXSh9R7lE1k9Hh20UUXlX6/fN6tWzft/ydNmqTV1Zfkoi7dhp4yw1FmU0rs03+HxFSZSdmgQQPt8aVLl2pJSyKVMNFIFAASEOVmTGaIyJR4CWDy2JFHHqlNl5ckpBTDJyIiUkHbtm213TOfeeYZnHHGGaUbxCSS5WaybEw2dhk4cCC+/PJLwx2kZebJ3XffjTZt2mhlRF599VVtBgd30SQiokxOOOEEbdnxoEGDtE1iZLdnSeB9+umnGDx4cOnSYpnBKHFLn50o91wyKCbLnPVZ+eKJJ57QZkhK4lASf++99562BFqSlTp5TH5v3759tRg1bdo0vPzyy9rXZGakJBHfeecd9OzZUzuODz/8sMxxyy7RF198sRYnpXyIxE2ZPSl/S9x7773aY7KZjSQ6d+3ape2cvWXLFtx0002uP69EmXDpNFEADB06FOXLl8chhxyCevXqldbvkNErqTkiAbJq1ap+HyYREZGma9eu2o3Yww8/jE6dOmk3WQ8++GDS9/Tp00db8iW7bcr3S40rmamfjdxQyc3TzTffjM6dO2uJSdn5U1/ORkRElEqWUH/22Wfa8uhLL71USzTKLtAyi1BmBupk1qJM4NBrMQr5/9THpO6wJCwlkSiJQpkMIr9fn8GvJwElkSizJN944w2MGDFCu5cTMkHkxhtvxLXXXqsNmskMR9ktOt2g3VlnnaUtsR4wYID2u5577rnSr19++eV46aWXtEE3iYly/LKTdatWrVx5HonMypMdYUx/NxERERERERERZUxsygxFmUFp1z333INRo0Zps/aJgoYzGomIiIiIiIiIiChnTDQSERERERERERFRzrh0moiIiIiIiIiIiHLGGY1ERERERERERESUMyYaiYiIiIiIiIiIKGdMNBIREREREREREVHOmGgkIiIiIiIiIiKinDHRSERERERERERERDljopGIiIiIiIiIiIhyxkQjERERERERERER5YyJRiIiIiIiIiIiIsoZE41ERERERERERESEXP0/LEhxXD0omFIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1600x400 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "### 代码开始 ### (≈ 10 行代码)\n",
    "fig, axes = plt.subplots(1, 3, figsize=(16, 4))\n",
    "\n",
    "data.plot(kind='scatter', x='tv', y='sales', ax=axes[0])\n",
    "data.plot(kind='scatter', x='radio', y='sales', ax=axes[1])\n",
    "data.plot(kind='scatter', x='newspaper', y='sales', ax=axes[2])\n",
    "\n",
    "x_tv = np.array([data.tv.min(), data.tv.max()])\n",
    "axes[0].plot(x_tv, params_tv[0][1]*x_tv + params_tv[0][0], 'r')\n",
    "\n",
    "x_radio = np.array([data.radio.min(), data.radio.max()])\n",
    "axes[1].plot(x_radio, params_radio[0][1]*x_radio + params_radio[0][0], 'r')\n",
    "\n",
    "x_newspaper = np.array([data.newspaper.min(), data.newspaper.max()])\n",
    "axes[2].plot(x_newspaper, params_newspaper[0][1] *\n",
    "             x_newspaper + params_newspaper[0][0], 'r')\n",
    "### 代码结束 ###"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3884203",
   "metadata": {},
   "source": [
    "这段代码的主要功能是 **可视化广告支出（电视、广播、报纸）与销售额之间的关系**，并绘制出拟合的线性回归直线。以下是代码的详细解释：\n",
    "\n",
    "---\n",
    "\n",
    "### 1. **导入 Matplotlib 并设置内联模式**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6a3f57a7",
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd9abe26",
   "metadata": {},
   "source": [
    "- `pyplot` 是 Matplotlib 的子模块，用于绘制图形。\n",
    "- `%matplotlib inline` 是 Jupyter Notebook 的魔法命令，用于在 Notebook 中直接显示图表。\n",
    "\n",
    "---\n",
    "\n",
    "### 2. **创建子图**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "335ec728",
   "metadata": {},
   "outputs": [],
   "source": [
    "fig, axes = plt.subplots(1, 3, figsize=(16, 4))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eeb19e24",
   "metadata": {},
   "source": [
    "- `plt.subplots` 创建一个包含 1 行 3 列的子图网格。\n",
    "- `fig` 是整个图表对象，`axes` 是一个包含 3 个子图的数组。\n",
    "- `figsize=(16, 4)` 设置整个图表的宽度为 16 英寸，高度为 4 英寸。\n",
    "\n",
    "---\n",
    "\n",
    "### 3. **绘制散点图**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8cdbde58",
   "metadata": {},
   "outputs": [],
   "source": [
    "data.plot(kind='scatter', x='tv', y='sales', ax=axes[0])\n",
    "data.plot(kind='scatter', x='radio', y='sales', ax=axes[1])\n",
    "data.plot(kind='scatter', x='newspaper', y='sales', ax=axes[2])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70fd1f69",
   "metadata": {},
   "source": [
    "- `data.plot` 是 Pandas 提供的绘图方法。\n",
    "- `kind='scatter'` 指定绘制散点图。\n",
    "- `x` 和 `y` 分别指定横轴和纵轴的数据列：\n",
    "  - 第一个子图：电视广告支出 (`tv`) 与销售额 (`sales`)。\n",
    "  - 第二个子图：广播广告支出 (`radio`) 与销售额 (`sales`)。\n",
    "  - 第三个子图：报纸广告支出 (`newspaper`) 与销售额 (`sales`)。\n",
    "- `ax=axes[i]` 指定将散点图绘制到对应的子图上。\n",
    "\n",
    "---\n",
    "\n",
    "### 4. **绘制拟合的线性回归直线**\n",
    "#### 电视广告\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ad5c7a08",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_tv = np.array([data.tv.min(), data.tv.max()])\n",
    "axes[0].plot(x_tv, params_tv[0][1]*x_tv + params_tv[0][0], 'r')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ce7462e",
   "metadata": {},
   "source": [
    "- `x_tv` 是电视广告支出的最小值和最大值，构成回归线的横轴范围。\n",
    "- `params_tv[0][1]` 是电视广告的回归系数（斜率），`params_tv[0][0]` 是截距。\n",
    "- `params_tv[0][1]*x_tv + params_tv[0][0]` 计算回归线在 `x_tv` 范围内的纵轴值。\n",
    "- `axes[0].plot` 在第一个子图上绘制回归线，`'r'` 指定线条为红色。\n",
    "\n",
    "#### 广播广告\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "01b3f33f",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_radio = np.array([data.radio.min(), data.radio.max()])\n",
    "axes[1].plot(x_radio, params_radio[0][1]*x_radio + params_radio[0][0], 'r')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "766f2d46",
   "metadata": {},
   "source": [
    "- 类似电视广告，绘制广播广告的回归线。\n",
    "\n",
    "#### 报纸广告\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0976e00b",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_newspaper = np.array([data.newspaper.min(), data.newspaper.max()])\n",
    "axes[2].plot(x_newspaper, params_newspaper[0][1] * x_newspaper + params_newspaper[0][0], 'r')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e548c1e7",
   "metadata": {},
   "source": [
    "- 类似电视广告，绘制报纸广告的回归线。\n",
    "\n",
    "---\n",
    "\n",
    "### 5. **最终效果**\n",
    "- 每个子图显示了广告支出与销售额的散点图，以及拟合的线性回归直线。\n",
    "- 红色直线表示模型拟合的结果，展示了广告支出与销售额之间的线性关系。\n",
    "\n",
    "---\n",
    "\n",
    "### 总结\n",
    "这段代码的核心是：\n",
    "1. 使用 Pandas 绘制广告支出与销售额的散点图。\n",
    "2. 使用 Matplotlib 绘制拟合的线性回归直线。\n",
    "3. 将散点图和回归线结合，直观展示广告支出与销售额之间的关系。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fa5b63eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "## 代码开始 ### (≈ 4 行代码)\n",
    "model = None\n",
    "## 代码结束 ###\n",
    "\n",
    "model.coef_, model.intercept_  # 返回模型自变量系数和截距项"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc55cbc4",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "参考答案  Exercise 9.3 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "798dd6c7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 0.04576465,  0.18853002, -0.00103749]), np.float64(2.938889369459412))"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "### 代码开始 ### (≈ 4 行代码)\n",
    "X = data[['tv', 'radio', 'newspaper']]\n",
    "y = data.sales\n",
    "\n",
    "model = LinearRegression()\n",
    "model.fit(X, y)\n",
    "### 代码结束 ###\n",
    "\n",
    "model.coef_, model.intercept_  # 返回模型自变量系数和截距项"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39a92eb7",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "期望输出 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91acaa06",
   "metadata": {},
   "outputs": [],
   "source": [
    "(array([ 0.04576465,  0.18853002, -0.00103749]), 2.9388893694594067)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9b523eb",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "接下来，我们希望对多元线性回归模型进行检验。使用 statsmodels 库提供的相关方法来完成拟合优度检验和变量显著性检验。 \n",
    "\n",
    "Exercise 9.4 \n",
    "\n",
    "挑战：使用 statsmodels 库提供的相关方法来完成上面多元回归模型的拟合优度检验和变量显著性检验。 \n",
    "\n",
    "提示：你可以使用 ` statsmodels.api.sm.OLS  ` 或 ` statsmodels.formula.api.smf  ` ，后一种实验未涉及，需自行了解学习。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a701eef7",
   "metadata": {},
   "outputs": [],
   "source": [
    "import statsmodels.formula.api as smf\n",
    "\n",
    "## 代码开始 ### (≈ 3 行代码)\n",
    "results = None\n",
    "## 代码结束 ###\n",
    "\n",
    "results.summary2()  # 输出模型摘要"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c0779cd",
   "metadata": {
    "lines_to_next_cell": 0
   },
   "source": [
    "参考答案  Exercise 9.4 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "872b05cc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "        <td>Model:</td>               <td>OLS</td>         <td>Adj. R-squared:</td>     <td>0.896</td> \n",
       "</tr>\n",
       "<tr>\n",
       "  <td>Dependent Variable:</td>       <td>sales</td>             <td>AIC:</td>         <td>780.3622</td>\n",
       "</tr>\n",
       "<tr>\n",
       "         <td>Date:</td>        <td>2025-04-03 09:55</td>        <td>BIC:</td>         <td>793.5555</td>\n",
       "</tr>\n",
       "<tr>\n",
       "   <td>No. Observations:</td>         <td>200</td>         <td>Log-Likelihood:</td>    <td>-386.18</td>\n",
       "</tr>\n",
       "<tr>\n",
       "       <td>Df Model:</td>              <td>3</td>           <td>F-statistic:</td>       <td>570.3</td> \n",
       "</tr>\n",
       "<tr>\n",
       "     <td>Df Residuals:</td>           <td>196</td>       <td>Prob (F-statistic):</td> <td>1.58e-96</td>\n",
       "</tr>\n",
       "<tr>\n",
       "      <td>R-squared:</td>            <td>0.897</td>            <td>Scale:</td>         <td>2.8409</td> \n",
       "</tr>\n",
       "</table>\n",
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "      <td></td>       <th>Coef.</th>  <th>Std.Err.</th>    <th>t</th>     <th>P>|t|</th> <th>[0.025</th>  <th>0.975]</th>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Intercept</th> <td>2.9389</td>   <td>0.3119</td>  <td>9.4223</td>  <td>0.0000</td> <td>2.3238</td>  <td>3.5540</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>tv</th>        <td>0.0458</td>   <td>0.0014</td>  <td>32.8086</td> <td>0.0000</td> <td>0.0430</td>  <td>0.0485</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>radio</th>     <td>0.1885</td>   <td>0.0086</td>  <td>21.8935</td> <td>0.0000</td> <td>0.1715</td>  <td>0.2055</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>newspaper</th> <td>-0.0010</td>  <td>0.0059</td>  <td>-0.1767</td> <td>0.8599</td> <td>-0.0126</td> <td>0.0105</td>\n",
       "</tr>\n",
       "</table>\n",
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "     <td>Omnibus:</td>    <td>60.414</td>  <td>Durbin-Watson:</td>    <td>2.084</td> \n",
       "</tr>\n",
       "<tr>\n",
       "  <td>Prob(Omnibus):</td>  <td>0.000</td> <td>Jarque-Bera (JB):</td> <td>151.241</td>\n",
       "</tr>\n",
       "<tr>\n",
       "       <td>Skew:</td>     <td>-1.327</td>     <td>Prob(JB):</td>      <td>0.000</td> \n",
       "</tr>\n",
       "<tr>\n",
       "     <td>Kurtosis:</td>    <td>6.332</td>  <td>Condition No.:</td>     <td>454</td>  \n",
       "</tr>\n",
       "</table><br/>\n",
       "Notes:<br/>\n",
       "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified."
      ],
      "text/latex": [
       "\\begin{table}\n",
       "\\caption{Results: Ordinary least squares}\n",
       "\\label{}\n",
       "\\begin{center}\n",
       "\\begin{tabular}{llll}\n",
       "\\hline\n",
       "Model:              & OLS              & Adj. R-squared:     & 0.896     \\\\\n",
       "Dependent Variable: & sales            & AIC:                & 780.3622  \\\\\n",
       "Date:               & 2025-04-03 09:55 & BIC:                & 793.5555  \\\\\n",
       "No. Observations:   & 200              & Log-Likelihood:     & -386.18   \\\\\n",
       "Df Model:           & 3                & F-statistic:        & 570.3     \\\\\n",
       "Df Residuals:       & 196              & Prob (F-statistic): & 1.58e-96  \\\\\n",
       "R-squared:          & 0.897            & Scale:              & 2.8409    \\\\\n",
       "\\hline\n",
       "\\end{tabular}\n",
       "\\end{center}\n",
       "\n",
       "\\begin{center}\n",
       "\\begin{tabular}{lrrrrrr}\n",
       "\\hline\n",
       "          &   Coef. & Std.Err. &       t & P$> |$t$|$ &  [0.025 & 0.975]  \\\\\n",
       "\\hline\n",
       "Intercept &  2.9389 &   0.3119 &  9.4223 &      0.0000 &  2.3238 & 3.5540  \\\\\n",
       "tv        &  0.0458 &   0.0014 & 32.8086 &      0.0000 &  0.0430 & 0.0485  \\\\\n",
       "radio     &  0.1885 &   0.0086 & 21.8935 &      0.0000 &  0.1715 & 0.2055  \\\\\n",
       "newspaper & -0.0010 &   0.0059 & -0.1767 &      0.8599 & -0.0126 & 0.0105  \\\\\n",
       "\\hline\n",
       "\\end{tabular}\n",
       "\\end{center}\n",
       "\n",
       "\\begin{center}\n",
       "\\begin{tabular}{llll}\n",
       "\\hline\n",
       "Omnibus:       & 60.414 & Durbin-Watson:    & 2.084    \\\\\n",
       "Prob(Omnibus): & 0.000  & Jarque-Bera (JB): & 151.241  \\\\\n",
       "Skew:          & -1.327 & Prob(JB):         & 0.000    \\\\\n",
       "Kurtosis:      & 6.332  & Condition No.:    & 454      \\\\\n",
       "\\hline\n",
       "\\end{tabular}\n",
       "\\end{center}\n",
       "\\end{table}\n",
       "\\bigskip\n",
       "Notes: \\newline \n",
       "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified."
      ],
      "text/plain": [
       "<class 'statsmodels.iolib.summary2.Summary'>\n",
       "\"\"\"\n",
       "                 Results: Ordinary least squares\n",
       "=================================================================\n",
       "Model:              OLS              Adj. R-squared:     0.896   \n",
       "Dependent Variable: sales            AIC:                780.3622\n",
       "Date:               2025-04-03 09:55 BIC:                793.5555\n",
       "No. Observations:   200              Log-Likelihood:     -386.18 \n",
       "Df Model:           3                F-statistic:        570.3   \n",
       "Df Residuals:       196              Prob (F-statistic): 1.58e-96\n",
       "R-squared:          0.897            Scale:              2.8409  \n",
       "------------------------------------------------------------------\n",
       "                Coef.   Std.Err.     t     P>|t|    [0.025  0.975]\n",
       "------------------------------------------------------------------\n",
       "Intercept       2.9389    0.3119   9.4223  0.0000   2.3238  3.5540\n",
       "tv              0.0458    0.0014  32.8086  0.0000   0.0430  0.0485\n",
       "radio           0.1885    0.0086  21.8935  0.0000   0.1715  0.2055\n",
       "newspaper      -0.0010    0.0059  -0.1767  0.8599  -0.0126  0.0105\n",
       "-----------------------------------------------------------------\n",
       "Omnibus:             60.414       Durbin-Watson:          2.084  \n",
       "Prob(Omnibus):       0.000        Jarque-Bera (JB):       151.241\n",
       "Skew:                -1.327       Prob(JB):               0.000  \n",
       "Kurtosis:            6.332        Condition No.:          454    \n",
       "=================================================================\n",
       "Notes:\n",
       "[1] Standard Errors assume that the covariance matrix of the\n",
       "errors is correctly specified.\n",
       "\"\"\""
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import statsmodels.formula.api as smf\n",
    "\n",
    "### 代码开始 ### (≈ 3 行代码)\n",
    "results = smf.ols(formula='sales ~ tv + radio + newspaper', data=data).fit()\n",
    "### 代码结束 ###\n",
    "\n",
    "results.summary2() # 输出模型摘要"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "48404ce8",
   "metadata": {},
   "source": [
    "这段代码的主要功能是 **使用多元线性回归模型拟合广告支出（电视、广播、报纸）与销售额之间的关系**，并输出模型的统计摘要。以下是代码的详细解释：\n",
    "\n",
    "---\n",
    "\n",
    "### **1. 导入模块**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91a20374",
   "metadata": {},
   "outputs": [],
   "source": [
    "import statsmodels.formula.api as smf"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "07862ce4",
   "metadata": {},
   "source": [
    "- `statsmodels` 是一个用于统计建模和数据分析的 Python 库。\n",
    "- `statsmodels.formula.api` 提供了基于公式的接口，用于构建回归模型。\n",
    "- `ols` 是 `statsmodels` 中的普通最小二乘法（Ordinary Least Squares）回归方法，用于拟合线性回归模型。\n",
    "\n",
    "---\n",
    "\n",
    "### **2. 构建并拟合多元线性回归模型**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a56bad32",
   "metadata": {},
   "outputs": [],
   "source": [
    "results = smf.ols(formula='sales ~ tv + radio + newspaper', data=data).fit()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11c57dd5",
   "metadata": {},
   "source": [
    "- **`smf.ols`**:\n",
    "  - 构建一个普通最小二乘法（OLS）回归模型。\n",
    "  - 参数：\n",
    "    - `formula='sales ~ tv + radio + newspaper'`：\n",
    "      - 使用公式字符串定义模型。\n",
    "      - `sales` 是因变量（目标变量）。\n",
    "      - `tv`、`radio` 和 `newspaper` 是自变量（特征变量）。\n",
    "      - `~` 表示因变量和自变量之间的关系。\n",
    "    - `data=data`：指定数据集，`data` 是一个 Pandas DataFrame，包含 `sales`、`tv`、`radio` 和 `newspaper` 列。\n",
    "- **`.fit()`**:\n",
    "  - 拟合模型，计算模型参数（截距和回归系数）。\n",
    "\n",
    "---\n",
    "\n",
    "### **3. 输出模型摘要**\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fd2ad492",
   "metadata": {},
   "outputs": [],
   "source": [
    "results.summary2()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "789eb935",
   "metadata": {},
   "source": [
    "- **`results`**:\n",
    "  - `results` 是拟合后的回归模型对象，包含模型的所有信息（如参数、统计量等）。\n",
    "- **`.summary2()`**:\n",
    "  - 输出模型的统计摘要，包含以下信息：\n",
    "    - **回归系数**：每个自变量（`tv`、`radio`、`newspaper`）的回归系数和截距。\n",
    "    - **显著性检验**：每个变量的 p 值，用于判断变量是否显著。\n",
    "    - **模型拟合指标**：\n",
    "      - \\( R^2 \\)：决定系数，表示模型对数据的拟合程度。\n",
    "      - 调整后的 \\( R^2 \\)：对变量数量进行调整后的拟合程度。\n",
    "    - **其他统计量**：如 F 检验、AIC、BIC 等。\n",
    "\n",
    "---\n",
    "\n",
    "### **总结**\n",
    "这段代码的核心功能是：\n",
    "1. 使用普通最小二乘法（OLS）拟合一个多元线性回归模型，分析广告支出（电视、广播、报纸）对销售额的影响。\n",
    "2. 输出模型的统计摘要，帮助评估模型的质量和每个变量的显著性。\n",
    "\n",
    "通过 `results.summary2()`，你可以直观地查看模型的回归系数、显著性水平和拟合效果，从而判断广告支出对销售额的影响程度及其显著性。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79452aa1",
   "metadata": {},
   "source": [
    "期望输出 \n",
    "\n",
    "Model:  |  OLS  |  Adj. R-squared:  |  0.896   \n",
    "---|---|---|---  \n",
    "Dependent Variable:  |  sales  |  AIC:  |  780.3622   \n",
    "Date:  |  |  BIC:  |  793.5555   \n",
    "No. Observations:  |  200  |  Log-Likelihood:  |  -386.18   \n",
    "Df Model:  |  3  |  F-statistic:  |  570.3   \n",
    "Df Residuals:  |  196  |  Prob (F-statistic):  |  1.58e-96   \n",
    "R-squared:  |  0.897  |  Scale:  |  2.8409   \n",
    "|  Coef.  |  Std.Err.  |  t  |  P>|t|  |  [0.025  |  0.975]   \n",
    "---|---|---|---|---|---|---  \n",
    "Intercept  |  2.9389  |  0.3119  |  9.4223  |  0.0000  |  2.3238  |  3.5540   \n",
    "tv  |  0.0458  |  0.0014  |  32.8086  |  0.0000  |  0.0430  |  0.0485   \n",
    "radio  |  0.1885  |  0.0086  |  21.8935  |  0.0000  |  0.1715  |  0.2055   \n",
    "newspaper  |  -0.0010  |  0.0059  |  -0.1767  |  0.8599  |  -0.0126  |  0.0105   \n",
    "Omnibus:  |  60.414  |  Durbin-Watson:  |  2.084   \n",
    "---|---|---|---  \n",
    "Prob(Omnibus):  |  0.000  |  Jarque-Bera (JB):  |  151.241   \n",
    "Skew:  |  -1.327  |  Prob(JB):  |  0.000   \n",
    "Kurtosis:  |  6.332  |  Condition No.:  |  454   \n",
    "  \n",
    "我们可以看到，这里得到的回归拟合系数和上文 scikit-learn 计算结果一致。于此同时，tv 和 radio 的 P 值接近于 0 [精度]，而 newspaper 的 P 值相对较大。我们可以认为 tv 和 radio 通过了变量显著性检验，而 newspaper 则未通过。实际上，你可以尝试去掉 newspaper 特征之后重新计算多元线性回归结果。 \n",
    "\n",
    "Model:  |  OLS  |  Adj. R-squared:  |  0.896   \n",
    "---|---|---|---  \n",
    "Dependent Variable:  |  sales  |  AIC:  |  778.3941   \n",
    "Date:  |  |  BIC:  |  788.2891   \n",
    "No. Observations:  |  200  |  Log-Likelihood:  |  -386.20   \n",
    "Df Model:  |  2  |  F-statistic:  |  859.6   \n",
    "Df Residuals:  |  197  |  Prob (F-statistic):  |  4.83e-98   \n",
    "R-squared:  |  0.897  |  Scale:  |  2.8270   \n",
    "|  Coef.  |  Std.Err.  |  t  |  P>|t|  |  [0.025  |  0.975]   \n",
    "---|---|---|---|---|---|---  \n",
    "Intercept  |  2.9211  |  0.2945  |  9.9192  |  0.0000  |  2.3403  |  3.5019   \n",
    "tv  |  0.0458  |  0.0014  |  32.9087  |  0.0000  |  0.0430  |  0.0485   \n",
    "radio  |  0.1880  |  0.0080  |  23.3824  |  0.0000  |  0.1721  |  0.2038   \n",
    "Omnibus:  |  60.022  |  Durbin-Watson:  |  2.081   \n",
    "---|---|---|---  \n",
    "Prob(Omnibus):  |  0.000  |  Jarque-Bera (JB):  |  148.679   \n",
    "Skew:  |  -1.323  |  Prob(JB):  |  0.000   \n",
    "Kurtosis:  |  6.292  |  Condition No.:  |  425   \n",
    "  \n",
    "上面是去掉 newspaper 特征之后重新计算的结果，你可以发现包含和未包含 newspaper 的多元线性回归模型  $R^2$  值均为 0.896。这也就印证了该特征对于反映目标数值变化并无太大帮助。你可以尝试去除其余两个特征之一后，再查看  $R^2$  拟合优度值的变化。 "
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "cell_metadata_filter": "-all",
   "main_language": "python",
   "notebook_metadata_filter": "-all"
  },
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
